// 导入express模块
const express = require('express')
// 创建express的服务器实例
const app = express()


// 导入配置文件
const config = require('./config')


// 配置cors跨域
const cors = require('cors')
app.use(cors())

//配置解析表单数据的中间件， 用来解析application/x-www-form-urlencoded格式的表单数据
app.use(express.urlencoded({extended: false}))





// 定义一个中间件，手动封装全局res.cc函数
app.use(function (req, res, next) {
    // status = 0 为成功； status = 1 为失败；默认status = 1，方便处理失败的情况
    res.cc = function (err, status = 1) {
        res.send({
            //状态
            status,
            //状态描述，判断err是错误对象还是字符串
            message: err instanceof Error ? err.message : err
        })
    }
    next()
})


// 一定要在注册路由之前配置解析Token的中间件
const expressJWT = require('express-jwt')


// 中间件：解析和验证 JWT
const authenticateJwt = expressJWT({
    secret: config.jwtSecretKey,
    isRevoked: (req, payload, done) => {
      const token = req.headers['authorization'].split(' ')[1];
      if (config.blacklistedTokens.includes(token)) {
        return done(null, true); // token 已经失效
      }
      done();
    }
  });


// 使用.unless({path: [/^\/api\//]})指定哪些接口不需要进行Token的身份认证
// app.use(expressJWT({secret: config.jwtSecretKey}).unless({path: [/^\/api\//]}))
app.use(authenticateJwt.unless({path: [/^\/api\//]}))


//托管静态资源文件
app.use('/uploads', express.static('./uploads'))



//导入并使用路由模块
const userRouter = require('./router/user')
app.use('/api', userRouter)

const userInfoRouter = require('./router/userInfo')
app.use('/my', userInfoRouter)


const artCateRouter = require('./router/artcate')
app.use('/art/cate', artCateRouter)

const articleRouter = require('./router/article')
app.use('/art/article', articleRouter)


//侧边栏luyou
const menusRouter = require('./router/menus')
app.use('/menus', menusRouter)




// 退出登录路由，将 token 加入黑名单
app.post('/logout', (req, res) => {
    if(!req.headers['authorization']){
        return res.send({status:1, message:'请传入token' })
    } 
    const token = req.headers['authorization'].split(' ')[1];
    // 添加到黑名单
    config.blacklistedTokens.push(token);
    res.send({ status:0,message: '退出登录成功' });
  });


const joi  = require('joi')

// 错误级别中间件
app.use((err, req, res, next)=>{
    // 数据验证失败导致的错误
    if(err instanceof joi.ValidationError){
        return res.cc(err)
    }

    // 捕获身份认证失败的错误
    if(err.name === 'UnauthorizedError') return res.cc('身份认证失败！')
    // 未知错误
    // console.log(res);
    // res.cc(err)
    res.send({status: 1, message: err.message})

})



// 调用 app.listen 方法，指定端口号并启动web服务器
app.listen(3007, ()=>{
    console.log('api server running at http://127.0.0.1:3007')
})